#ifndef __ABSTRACT_H__
#define __ABSTRACT_H__

class AProductX;
class AProductY;
class AFactory
{
public:
    AFactory() = default;
    virtual ~AFactory() = default;

    virtual AProductX *CreateProductX() = 0;
    virtual AProductY *CreateProductY() = 0;
};

class Factory1 : public AFactory
{
public:
    Factory1() = default;
    ~Factory1() = default;

    AProductX *CreateProductX();
    AProductY *CreateProductY();
};

class Factory2 : public AFactory
{
public:
    Factory2() = default;
    ~Factory2() = default;

    AProductX *CreateProductX();
    AProductY *CreateProductY();
};

#endif

